/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2022 All Rights Reserved.
 */
package com.example.spider.proxy.core;

import org.shoulder.core.context.AppInfo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.Iterator;

/**
 * 爬虫直接爬下来的原始ip代理池
 * java.policy 可以禁止程序读写文件，使用反射等，便于安全长期部署
 *
 * @author lym
 */
public interface ProxyRepository {

    @Async
    @Scheduled(cron = "0 */3 * * * ?")
    void validateAllProxy();

    void add(ProxyInfo proxyInfo);

    void update(ProxyInfo proxyInfo);

    Iterator<ProxyInfo> getIterator();

    default void scheduledWriteCacheToFile() {

    }

    //void addAll(Collection<? extends ProxyInfo> proxyInfos);
    //
    //ProxyInfo remove(String ip, int port);

    //boolean removeIf(Predicate<? super ProxyInfo> filter);

    /**
     * 源ip代理池，可只存ip:port类型，（源ip代理绝大部分不能用）
     * 持久化存储，定期清理，无状态数据
     */
    String SOURCE = "SOURCE_IP_PROXY_REPO";
    String SOURCE_REPO_REDIS_KEY_DEFAULT = AppInfo.appId() + ":proxy:repo:source";

    /**
     * 可用的（经过 tester 初步验证的）
     * 建议内存 or redis 存储，启动时可为空
     */
    String USABLE = "USABLE_IP_PROXY_REPO";
    String USABLE_REPO_REDIS_KEY_DEFAULT = AppInfo.appId() + ":proxy:repo:usable";

    /**
     * 可用的、信息完整的（Optional）
     * 建议持久化 + redis 等内存存储，每次客户端启动从这读
     */
    String STABLE = "STABLE_IP_PROXY_REPO";
    String STABLE_REPO_REDIS_KEY_DEFAULT = AppInfo.appId() + ":proxy:repo:stable";

    /**
     * 近端缓存（Optional）
     */
    String CLIENT = "CLIENT_REPO";

    /**
     * xxBiz 过滤（Optional）
     */
    //String XXX = "XXX_REPO";

}